/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.ces4.produccion.jpa.controllers;

import co.com.ces4.produccion.jpa.controllers.exceptions.IllegalOrphanException;
import co.com.ces4.produccion.jpa.controllers.exceptions.NonexistentEntityException;
import co.com.ces4.produccion.jpa.controllers.exceptions.PreexistingEntityException;
import co.com.ces4.produccion.jpa.entities.ArticuloLinea;
import co.com.ces4.produccion.jpa.entities.ArticuloLineaPK;
import java.io.Serializable;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import co.com.ces4.produccion.jpa.entities.LineaProduccion;
import co.com.ces4.produccion.jpa.entities.Articulo;
import co.com.ces4.produccion.jpa.entities.DetalleOrdenProduccion;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author usuario
 */
public class ArticuloLineaJpaController implements Serializable {

    public ArticuloLineaJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(ArticuloLinea articuloLinea) throws PreexistingEntityException, Exception {
        if (articuloLinea.getArticuloLineaPK() == null) {
            articuloLinea.setArticuloLineaPK(new ArticuloLineaPK());
        }
        if (articuloLinea.getDetalleOrdenProduccionList() == null) {
            articuloLinea.setDetalleOrdenProduccionList(new ArrayList<DetalleOrdenProduccion>());
        }
        articuloLinea.getArticuloLineaPK().setNmlinea(articuloLinea.getLineaProduccion().getNmid());
        articuloLinea.getArticuloLineaPK().setDsarticulo(articuloLinea.getArticulo().getDsid());
        EntityManager em = null;
        try {
            em = getEntityManager();
            ArticuloLinea persistentArticuloLinea = em.find(ArticuloLinea.class, articuloLinea.getArticuloLineaPK());
            if (persistentArticuloLinea == null) {
                em.getTransaction().begin();
                LineaProduccion lineaProduccion = articuloLinea.getLineaProduccion();
                if (lineaProduccion != null) {
                    lineaProduccion = em.getReference(lineaProduccion.getClass(), lineaProduccion.getNmid());
                    articuloLinea.setLineaProduccion(lineaProduccion);
                }
                Articulo articulo = articuloLinea.getArticulo();
                if (articulo != null) {
                    articulo = em.getReference(articulo.getClass(), articulo.getDsid());
                    articuloLinea.setArticulo(articulo);
                }
                List<DetalleOrdenProduccion> attachedDetalleOrdenProduccionList = new ArrayList<DetalleOrdenProduccion>();
                for (DetalleOrdenProduccion detalleOrdenProduccionListDetalleOrdenProduccionToAttach : articuloLinea.getDetalleOrdenProduccionList()) {
                    detalleOrdenProduccionListDetalleOrdenProduccionToAttach = em.getReference(detalleOrdenProduccionListDetalleOrdenProduccionToAttach.getClass(), detalleOrdenProduccionListDetalleOrdenProduccionToAttach.getDetalleOrdenProduccionPK());
                    attachedDetalleOrdenProduccionList.add(detalleOrdenProduccionListDetalleOrdenProduccionToAttach);
                }
                articuloLinea.setDetalleOrdenProduccionList(attachedDetalleOrdenProduccionList);
                em.persist(articuloLinea);
                /*if (lineaProduccion != null) {
                lineaProduccion.getArticuloLineaList().add(articuloLinea);
                lineaProduccion = em.merge(lineaProduccion);
                }
                if (articulo != null) {
                articulo.getArticuloLineaList().add(articuloLinea);
                articulo = em.merge(articulo);
                }
                for (DetalleOrdenProduccion detalleOrdenProduccionListDetalleOrdenProduccion : articuloLinea.getDetalleOrdenProduccionList()) {
                ArticuloLinea oldNmlineaOfDetalleOrdenProduccionListDetalleOrdenProduccion = detalleOrdenProduccionListDetalleOrdenProduccion.getNmlinea();
                detalleOrdenProduccionListDetalleOrdenProduccion.setNmlinea(articuloLinea);
                detalleOrdenProduccionListDetalleOrdenProduccion = em.merge(detalleOrdenProduccionListDetalleOrdenProduccion);
                if (oldNmlineaOfDetalleOrdenProduccionListDetalleOrdenProduccion != null) {
                oldNmlineaOfDetalleOrdenProduccionListDetalleOrdenProduccion.getDetalleOrdenProduccionList().remove(detalleOrdenProduccionListDetalleOrdenProduccion);
                oldNmlineaOfDetalleOrdenProduccionListDetalleOrdenProduccion = em.merge(oldNmlineaOfDetalleOrdenProduccionListDetalleOrdenProduccion);
                }
                }*/
                em.getTransaction().commit();
            } else {
                edit(articuloLinea);
            }
        } catch (Exception ex) {
            if (findArticuloLinea(articuloLinea.getArticuloLineaPK()) != null) {
                throw new PreexistingEntityException("ArticuloLinea " + articuloLinea + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(ArticuloLinea articuloLinea) throws IllegalOrphanException, NonexistentEntityException, Exception {
        articuloLinea.getArticuloLineaPK().setNmlinea(articuloLinea.getLineaProduccion().getNmid());
        articuloLinea.getArticuloLineaPK().setDsarticulo(articuloLinea.getArticulo().getDsid());
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            ArticuloLinea persistentArticuloLinea = em.find(ArticuloLinea.class, articuloLinea.getArticuloLineaPK());
            LineaProduccion lineaProduccionOld = persistentArticuloLinea.getLineaProduccion();
            LineaProduccion lineaProduccionNew = articuloLinea.getLineaProduccion();
            Articulo articuloOld = persistentArticuloLinea.getArticulo();
            Articulo articuloNew = articuloLinea.getArticulo();
            List<DetalleOrdenProduccion> detalleOrdenProduccionListOld = persistentArticuloLinea.getDetalleOrdenProduccionList();
            List<DetalleOrdenProduccion> detalleOrdenProduccionListNew = articuloLinea.getDetalleOrdenProduccionList();
            List<String> illegalOrphanMessages = null;
            for (DetalleOrdenProduccion detalleOrdenProduccionListOldDetalleOrdenProduccion : detalleOrdenProduccionListOld) {
                if (!detalleOrdenProduccionListNew.contains(detalleOrdenProduccionListOldDetalleOrdenProduccion)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain DetalleOrdenProduccion " + detalleOrdenProduccionListOldDetalleOrdenProduccion + " since its nmlinea field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (lineaProduccionNew != null) {
                lineaProduccionNew = em.getReference(lineaProduccionNew.getClass(), lineaProduccionNew.getNmid());
                articuloLinea.setLineaProduccion(lineaProduccionNew);
            }
            if (articuloNew != null) {
                articuloNew = em.getReference(articuloNew.getClass(), articuloNew.getDsid());
                articuloLinea.setArticulo(articuloNew);
            }
            List<DetalleOrdenProduccion> attachedDetalleOrdenProduccionListNew = new ArrayList<DetalleOrdenProduccion>();
            for (DetalleOrdenProduccion detalleOrdenProduccionListNewDetalleOrdenProduccionToAttach : detalleOrdenProduccionListNew) {
                detalleOrdenProduccionListNewDetalleOrdenProduccionToAttach = em.getReference(detalleOrdenProduccionListNewDetalleOrdenProduccionToAttach.getClass(), detalleOrdenProduccionListNewDetalleOrdenProduccionToAttach.getDetalleOrdenProduccionPK());
                attachedDetalleOrdenProduccionListNew.add(detalleOrdenProduccionListNewDetalleOrdenProduccionToAttach);
            }
            detalleOrdenProduccionListNew = attachedDetalleOrdenProduccionListNew;
            articuloLinea.setDetalleOrdenProduccionList(detalleOrdenProduccionListNew);
            articuloLinea = em.merge(articuloLinea);
            if (lineaProduccionOld != null && !lineaProduccionOld.equals(lineaProduccionNew)) {
                lineaProduccionOld.getArticuloLineaList().remove(articuloLinea);
                lineaProduccionOld = em.merge(lineaProduccionOld);
            }
            if (lineaProduccionNew != null && !lineaProduccionNew.equals(lineaProduccionOld)) {
                lineaProduccionNew.getArticuloLineaList().add(articuloLinea);
                lineaProduccionNew = em.merge(lineaProduccionNew);
            }
            if (articuloOld != null && !articuloOld.equals(articuloNew)) {
                articuloOld.getArticuloLineaList().remove(articuloLinea);
                articuloOld = em.merge(articuloOld);
            }
            if (articuloNew != null && !articuloNew.equals(articuloOld)) {
                articuloNew.getArticuloLineaList().add(articuloLinea);
                articuloNew = em.merge(articuloNew);
            }
            for (DetalleOrdenProduccion detalleOrdenProduccionListNewDetalleOrdenProduccion : detalleOrdenProduccionListNew) {
                if (!detalleOrdenProduccionListOld.contains(detalleOrdenProduccionListNewDetalleOrdenProduccion)) {
                    ArticuloLinea oldNmlineaOfDetalleOrdenProduccionListNewDetalleOrdenProduccion = detalleOrdenProduccionListNewDetalleOrdenProduccion.getNmlinea();
                    detalleOrdenProduccionListNewDetalleOrdenProduccion.setNmlinea(articuloLinea);
                    detalleOrdenProduccionListNewDetalleOrdenProduccion = em.merge(detalleOrdenProduccionListNewDetalleOrdenProduccion);
                    if (oldNmlineaOfDetalleOrdenProduccionListNewDetalleOrdenProduccion != null && !oldNmlineaOfDetalleOrdenProduccionListNewDetalleOrdenProduccion.equals(articuloLinea)) {
                        oldNmlineaOfDetalleOrdenProduccionListNewDetalleOrdenProduccion.getDetalleOrdenProduccionList().remove(detalleOrdenProduccionListNewDetalleOrdenProduccion);
                        oldNmlineaOfDetalleOrdenProduccionListNewDetalleOrdenProduccion = em.merge(oldNmlineaOfDetalleOrdenProduccionListNewDetalleOrdenProduccion);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                ArticuloLineaPK id = articuloLinea.getArticuloLineaPK();
                if (findArticuloLinea(id) == null) {
                    throw new NonexistentEntityException("The articuloLinea with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(ArticuloLineaPK id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            ArticuloLinea articuloLinea;
            try {
                articuloLinea = em.getReference(ArticuloLinea.class, id);
                articuloLinea.getArticuloLineaPK();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The articuloLinea with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            List<DetalleOrdenProduccion> detalleOrdenProduccionListOrphanCheck = articuloLinea.getDetalleOrdenProduccionList();
            for (DetalleOrdenProduccion detalleOrdenProduccionListOrphanCheckDetalleOrdenProduccion : detalleOrdenProduccionListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This ArticuloLinea (" + articuloLinea + ") cannot be destroyed since the DetalleOrdenProduccion " + detalleOrdenProduccionListOrphanCheckDetalleOrdenProduccion + " in its detalleOrdenProduccionList field has a non-nullable nmlinea field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            LineaProduccion lineaProduccion = articuloLinea.getLineaProduccion();
            if (lineaProduccion != null) {
                lineaProduccion.getArticuloLineaList().remove(articuloLinea);
                lineaProduccion = em.merge(lineaProduccion);
            }
            Articulo articulo = articuloLinea.getArticulo();
            if (articulo != null) {
                articulo.getArticuloLineaList().remove(articuloLinea);
                articulo = em.merge(articulo);
            }
            em.remove(articuloLinea);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<ArticuloLinea> findArticuloLineaEntities() {
        return findArticuloLineaEntities(true, -1, -1);
    }

    public List<ArticuloLinea> findArticuloLineaEntities(int maxResults, int firstResult) {
        return findArticuloLineaEntities(false, maxResults, firstResult);
    }

    private List<ArticuloLinea> findArticuloLineaEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(ArticuloLinea.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public ArticuloLinea findArticuloLinea(ArticuloLineaPK id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(ArticuloLinea.class, id);
        } finally {
            em.close();
        }
    }

    public int getArticuloLineaCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<ArticuloLinea> rt = cq.from(ArticuloLinea.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
}
